package cn.com.wxd.service.robot.tuling;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.wxd.common.JsonUtil;
import cn.com.wxd.common.data.KVMap;

/**
 * Title:机器人知识库
 * Description:cn.com.wxd.service.robot.tuling
 * 
 * Company: Amumu管理平台
 * Copyright: Copyright (c) 2015
 * All right reserved.
 * Created time: 2016-8-25 上午11:20:02
 *
 * @author WangXuDong
 * @version 1.0
 */
public class RobotKnowledge {
	private static final Logger log = LoggerFactory.getLogger(RobotKnowledge.class);
	String key; //key
	String addSDK;  //增加知识SDK
	String deleteSDK;//删除知识SDK
	String editSDK;//编辑知识SDK
	String querySDK;//查询知识SDK
	String editNameSDK;//修改机器人名称SDK
	/**
	 * 实例化机器人类，配置文件错误将抛出异常
	 */
	public RobotKnowledge(){
		key = TuLingconfigInfo.getKey();
		addSDK = TuLingconfigInfo.getAddSDK();
		deleteSDK = TuLingconfigInfo.getDeleteSDK();
		editSDK = TuLingconfigInfo.getEditSDK();
		querySDK = TuLingconfigInfo.getQuerySDK();
		editNameSDK = TuLingconfigInfo.getEditNameSDK();
		if(key.length()!=32){
			try {
				throw new Exception("图灵机器人key错误");
			} catch (Exception e) {
                log.error("图灵机器人key错误",e);
			}
			return;
		}
	}
	/**
	 * 添加机器人的知识
	 * @param key 官网提供的key
	 * @param questions key用户题问问题 value机器人回答的问题
	 * @return 0	请求成功
			101	请求内容为空
			201	请求超时
			301	异常信息(json格式错误，500错误等)
			401	帐号不合法
			403	帐号上传权限已经用尽
			404	帐号没有知识库接口使用权限
			405	帐号开启安全模式，token校验失败
			501	json请求的内容有误
	 * @throws IOException 
	 */
	public String addKnowledge(KVMap<String, String> questions) throws IOException{
		String data = "{'apikey':'"+key+"',data:[";
		for (int i = 0; i < questions.size(); i++) {
			String question = questions.getKeyIndex(i);
			String answer = questions.getValueIndex(i);
			data+="{'question':'"+question+"','answer':'"+answer+"'},";
		}
		data = data.substring(0,data.lastIndexOf(","))+"]}";
		String sb = sendPost(addSDK,data);
		Map<String,String> map = ConvertRetJson(sb);
		if(map==null){
			return "201";
		}
		return map.get("code");
	}
	/**
	 * 删除机器人的知识
	 * @param 
	 * @param ids 知识的ids 使用,分隔开，如1,2,3,4
	 * @return 0	请求成功
			101	请求内容为空
			201	请求超时
			301	异常信息(json格式错误，500错误等)
			401	帐号不合法
			403	帐号上传权限已经用尽
			404	帐号没有知识库接口使用权限
			405	帐号开启安全模式，token校验失败
			501	json请求的内容有误
	 * @throws IOException 
	 */
	public String deleteKnowledge(String ids) throws IOException{
		String data = "{'apikey':'"+key+"',data:{'clear': {'isclear': false},'ids': ["+ids+"]}}";
		String sb = sendPost(deleteSDK,data);
		Map<String,String> map = ConvertRetJson(sb);
		if(map==null){
			return "201";
		}
		return map.get("code");
	}
	/**
	 * 查询机器人的知识
	 * @param 
	 * @return json数据
	 * @throws IOException 
	 */
	public String queryKnowledge(int pageIndex,int pageSize,String keyWord) throws IOException{
		String data = "{'apikey':'"+key+"',data:{'pages':{'pageNumber':"+pageIndex+",'pageSize':"+pageSize+",'searchBy': '"+keyWord+"'}}}";
		String sb = sendPost(querySDK,data);
		return sb;
	}
	/**
	 * 编辑机器人的知识
	 * @param id 问题的id数组
	 * @param questions key用户题问问题 value机器人回答的问题
	 * @return 0	请求成功
			101	请求内容为空
			201	请求超时
			301	异常信息(json格式错误，500错误等)
			401	帐号不合法
			403	帐号上传权限已经用尽
			404	帐号没有知识库接口使用权限
			405	帐号开启安全模式，token校验失败
			501	json请求的内容有误
	 * @throws IOException 
	 */
	public String editKnowledge(String[] ids,KVMap<String, String> questions) throws IOException{
		String data = "{'apikey':'"+key+"',data:[";
		for (int i = 0; i < questions.size(); i++) {
			String question = questions.getKeyIndex(i);
			String answer = questions.getValueIndex(i);
			data+="{'id':'"+ids[i]+"','question':'"+question+"','answer':'"+answer+"'},";
		}
		data = data.substring(0,data.lastIndexOf(","))+"]}";
		String sb = sendPost(editNameSDK,data);
		Map<String,String> map = ConvertRetJson(sb);
		if(map==null){
			return "201";
		}
		return map.get("code");
	}
	/**
	 * 修改机器人名称
	 * @param key 官网提供的key
	 * @param newName 机器人新名称
	 * @return 0	请求成功
			101	请求内容为空
			201	请求超时
			301	异常信息(json格式错误，500错误等)
			401	帐号不合法
			403	帐号上传权限已经用尽
			404	帐号没有知识库接口使用权限
			405	帐号开启安全模式，token校验失败
			501	json请求的内容有误
	 * @throws IOException 
	 */
	public String editRobotName(String newName) throws IOException{
		String data="{'apikey': '"+key+"','data': '"+newName+"'}";
		String sb = sendPost(editNameSDK,data);
		Map<String,String> map = ConvertRetJson(sb);
		if(map==null){
			return "201";
		}
		return map.get("code");
	}
	/**
	 * 内部对象用于降服务器返回的信息转成对象
	 * @param json 服务器返回的json
	 * @return RobotTall机器人回复信息对象
	 */
	private Map<String,String> ConvertRetJson(String json){
		return JsonUtil.jsonToStrMap(json);
	}
	/**
	 * 向指定 URL 发送POST方法的请求
	 * 
	 * @param url
	 *            发送请求的 URL
	 * @param param
	 *            请求参数，请求参数应该是 name1=value1&name2=value2 的形式。
	 * @return 所代表远程资源的响应结果
	 */
	private String sendPost(String url, String param) {
		BufferedReader reader = null;
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream(), "utf-8"));
			String sb = new String();
			String line = "";
			while ((line = reader.readLine()) != null) {
				sb+=line;
			}
			return sb;
		} catch (Exception e) {
            log.error("",e);
		}
		//使用finally块来关闭输出流、输入流
		finally{
			if(reader!=null){
				try {
					reader.close();
				} catch (IOException e) {
                    log.error("",e);
				}
			}
		}
		return "";
	}
}
